import { useUserStore } from '@/stores'
import axios, {
  type AxiosInstance,
  type AxiosResponse,
  type InternalAxiosRequestConfig,
} from 'axios'
import { ElMessage } from 'element-plus'

/**
 * 响应数据接口定义
 */

export interface ApiResponse<T = unknown> {
  code: number
  message: string
  data?: T | null
}

// 确定API基础URL
let baseURL = import.meta.env.VITE_API_BASE_URL || '/api'

// 检查是否在Electron环境中运行
if (typeof window !== 'undefined' && window.location.protocol === 'file:') {
  // 在Electron环境中，使用绝对URL
  baseURL = import.meta.env.VITE_API_SERVER_URL || 'http://sph-api.atguigu.cn'
}

// 创建axios实例
const service: AxiosInstance = axios.create({
  baseURL,
  timeout: 5000,
  headers: {
    'Content-Type': 'application/json',
  },
})
// 请求拦截器
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    const userStore = useUserStore()
    const Authorization = 'Bearer ' + userStore.token

    if (import.meta.env.DEV) {
      console.log('🚀 发送请求:', {
        url: config.url,
        method: config.method,
        data: config.data,
        params: config.params,
      })
    }

    //处理header和token
    if (Authorization && config.headers) {
      config.headers.Authorization = `${Authorization}`
    } else {
      config.headers.Authorization = ''
    }

    return config
  },
  (error) => {
    ElMessage.error(error.message || '请求失败')
    return Promise.reject(error)
  },
)

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse<ApiResponse>) => {
    const { data } = response

    if (data.code === 200) {
      // 业务成功处理

      // 在开发环境下打印响应信息
      if (import.meta.env.DEV) {
        console.log('📥 收到响应:', {
          url: response.config.url,
          status: response.status,
          data: data,
        })
      }

      return {
        ...response,
        data,
      }
    } else if (data.code === 201) {
      // 未授权，清除token并跳转到登录页
      useUserStore().logout()
      ElMessage.error(data.data as string)
      return Promise.reject('未授权')
    } else {
      // 业务错误处理
      const errorMessage = data.message || '请求失败'

      // 在开发环境下打印错误信息
      if (import.meta.env.DEV) {
        console.error('❌ 业务错误:', {
          url: response.config.url,
          code: data.code,
          message: errorMessage,
          data: data.data,
        })
      }

      ElMessage.error(errorMessage)
      return Promise.reject(errorMessage)
    }
  },
  (error) => {
    // HTTP 状态码错误处理
    let message = '网络错误'

    if (error.response.data.message) {
      message = error.response.data.message
    } else if (error.response.status) {
      const { status } = error.response
      switch (status) {
        case 400:
          message = '请求参数错误'
          break
        case 401:
          message = '未授权，请重新登录'
          // 清除本地存储的认证信息
          localStorage.removeItem('auth-token')
          localStorage.removeItem('user-info')
          // 可以在这里跳转到登录页面
          break
        case 403:
          message = '拒绝访问'
          break
        case 404:
          message = '请求的资源不存在'
          break
        case 500:
          message = '服务器内部错误'
          break
        case 502:
          message = '网关错误'
          break
        case 503:
          message = '服务不可用'
          break
        case 504:
          message = '网关超时'
          break
        default:
          message = `连接错误${status}`
      }
    } else if (error.code === 'ECONNABORTED') {
      message = '请求超时'
    } else if (error.message.includes('Network Error')) {
      message = '网络连接异常'
    }

    // 在开发环境下打印错误信息
    if (import.meta.env.DEV) {
      console.error('❌ 响应错误:', {
        error,
        url: error.response?.config.url,
        status: error.response?.status,
        message: error.message,
      })
    }
    ElMessage.error(message)
    return Promise.reject(error)
  },
)

// 导出 axios 实例，供特殊情况使用
export default service
